package com.zyz.aspect;

import com.zyz.exception.NotLoggedInException;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoginCheckAspect {

    /**
     * 定义切入点：匹配需要登录校验的 service 方法（比如标记了 @LoginRequired 注解的方法）
     * 这里为示例，假设所有 com.zyz.service 包下的方法都需要校验
     */
    @Pointcut("execution(* com.zyz.service..*(..))")
    public void loginRequiredMethods() {}

    /**
     * 环绕通知：方法执行前做登录校验，未登录则抛异常阻止执行
     */
    @Around("loginRequiredMethods()")
    public Object checkLogin(ProceedingJoinPoint joinPoint) throws Throwable {
        // 模拟登录状态检查，比如从 ThreadLocal、Session、Token 里取当前用户
        boolean loggedIn = checkUserIsLoggedIn();

        if (!loggedIn) {
            // 用户未登录，抛出异常阻止执行
            throw new NotLoggedInException("用户未登录，禁止访问：" + joinPoint.getSignature().getName());
        }

        // 已登录，继续执行目标方法
        return joinPoint.proceed();
    }

    // 模拟一个方法判断用户是否登录
    private boolean checkUserIsLoggedIn() {
        // 实际应用中，这里可能是从 Session、SecurityContextHolder、Token 里判断
        // 这里简单模拟，返回false表示未登录
        return false;  // 你可以改成true测试已登录情况
    }
}
